﻿/**
 * @file NandBlock.h
 * @brief NAND块仿真模块，负责页读写和擦除操作。
 */
#ifndef __NandBlock_h__
#define __NandBlock_h__

#include <memory>
#include "Nand/Types.h"
#include "Nand/Sim/NandBlockTracker.h"
#include "Nand/Sim/NandDeviceDesc.h"
#include "Buffer/Types.h"
#include "Buffer/Hal/BufferHal.h"

/**
 * @class NandBlock
 * @brief NAND块仿真类，管理块内数据和擦除状态。
 */
class NandBlock
{
public:
    /**
     * @brief 构造函数，初始化块内缓冲区和参数。
     * @param bufferHal 缓冲区管理器
     * @param pagesPerBlock 块内页数
     * @param totalBytesPerPage 每页字节数
     */
    NandBlock(BufferHal *bufferHal, U32 pagesPerBlock, U32 totalBytesPerPage);
    NandBlock(NandBlock &&rhs) = default;

    /**
     * @brief 擦除整个块，恢复为擦除模式。
     */
    void Erase();

    /**
     * @brief 写整页数据。
     * @param page 页号
     * @param inBuffer 输入缓冲区
     */
    void WritePage(tPageInBlock page, const Buffer &inBuffer);

    /**
     * @brief 写部分页数据。
     * @param page 页号
     * @param sector 起始扇区
     * @param sectorCount 扇区数
     * @param inBuffer 输入缓冲区
     * @param bufferOffset 输入缓冲区偏移
     */
    void WritePage(const tPageInBlock &page, const tSectorInPage &sector, const tSectorCount &sectorCount, const Buffer &inBuffer, const tSectorOffset &bufferOffset);

    /**
     * @brief 读整页数据。
     * @param page 页号
     * @param outBuffer 输出缓冲区
     * @return 是否成功
     */
    bool ReadPage(tPageInBlock page, const Buffer &outBuffer);

    /**
     * @brief 读部分页数据。
     * @param page 页号
     * @param sector 起始扇区
     * @param sectorCount 扇区数
     * @param outBuffer 输出缓冲区
     * @param bufferOffset 输出缓冲区偏移
     * @return 是否成功
     */
    bool ReadPage(const tPageInBlock &page, const tSectorInPage &sector, const tSectorCount &sectorCount, const Buffer &outBuffer, const tSectorOffset &bufferOffset);

    static const U8 ERASED_PATTERN = 0xff; ///< 擦除后数据模式

private:
    NandBlockTracker _NandBlockTracker;  ///< 块内页状态跟踪
    BufferHal *_BufferHal;               ///< 缓冲区管理器
    U32 _PagesPerBlock;                  ///< 块内页数
    U32 _TotalBytesPerPage;              ///< 每页字节数
    std::unique_ptr<U8[]> _Buffer;       ///< 块数据缓冲区
    std::unique_ptr<U8[]> _ErasedBuffer; ///< 擦除状态缓冲区
};

#endif
